package cn.tedu.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

public class Test3 {
    public static void main(String[] args) throws ClassNotFoundException {
//        method();//获取Class对象
//        method2();//获取包名，类名
//        method3();//获取所有的构造方法们
//        method4();//获取所有的方法们
        method5();//获取所有属性们
    }
    //获取所有属性们
    public static void method5() throws ClassNotFoundException {
        //1.获取Class对象
        Class c=Class.forName("cn.tedu.reflection.Person");
        //2.使用Class的方法getFields()
        Field[] Fs=c.getFields();//只能获取公共的方法，默认的default 和私有的private都无法获取。
        //遍历数组，获取每个变量
        for (Field f:Fs){
            //获取变量名
            System.out.println(f.getName());
            //获取变量的类型
            System.out.println(f.getType().getName());
        }
    }

    //获取所有的方法们
    public static void method4() {
        //1.获取Class对象
        Class c=Person.class;
        //2.使用Class的方法getMethods()--获取自己和父类的
        Method[] ms=c.getMethods();//只能获取公共的方法，默认的default 和私有的private都无法获取。
        //遍历数组，获取每个方法
        for(Method m:ms){
            //获取方法名
            System.out.println(m.getName());
            //获取参数的类型
            Class[] cc=m.getParameterTypes();
            System.out.println(Arrays.toString(cc));
        }
    }
    //获取所有的构造方法们
    public static void method3() {
        //1.获取Class对象
        Class c=Person.class;
        //2.使用Class的方法getConstructors()
        Constructor[] cs=c.getConstructors();//只能获取公共的构造方法，默认的default 和私有的private都无法获取。
        //遍历数组，获取每个构造方法
        for(Constructor co:cs){
        //获取名字
            System.out.println(co.getName());
            //获取 参数类型
            Class[] cs2=co.getParameterTypes();
            System.out.println(Arrays.toString(cs2));
        }

    }
    //获取包名，类名
    public static void method2() {
        //1.获取Class对象
       Class c=Person.class;
       //2.使用Class的方法
        System.out.println(c.getSimpleName());//；类名
        System.out.println(c.getPackage().getName());//包名
        System.out.println(c.getName());//全路径名
    }
    //获取Class对象
    private static void method() throws ClassNotFoundException {
//     new Person().getClass();
        Class c1=  Class.forName("cn.tedu.reflection.Person");
        Class c2=  Person.class;
//        Class c3= new Person().getClass();
        System.out.println(c1.getSimpleName());
        System.out.println(c1.getPackage().getName());
        System.out.println(c1.getName());
    }

}
